<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html>
<head>
<title>Dialoge in PyQt4</title>
<link rel="stylesheet" href="../format.css" type="text/css">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="keywords" content="PyQt, PyQt4, Dialogs, tutorial, python, Linux">
<meta nam="description" content="Dialoge in PyQt4">
<meta name="language" content="de">
<meta name="author" content="Jan Bodnar">
<meta name="distribution" content="global">
<meta name="translation" content="manuel stein">
</head>

<body>

<div class="content">


<a href="/" title="Home">Home</a>&nbsp;
<a href=".." title="Home">Contents</a>


<h1>Dialoge in PyQt4</h1>

<p>
Dialogfenster oder Dialoge sind unverzichtbarer Bestandteil der meisten 
modernen grafischen Anwendungen. Ein Dialog wird als Austausch zwischen 
zwei oder mehr Personen definiert. Bei einer Computeranwendung ist ein 
Dialog ein Fenster, das verwendet wird, um mit der Anwendung zu <q>reden</q>. 
Ein Dialog wird benutzt, um Daten zu übergeben und zu bearbeiten, 
Anwendungseinstellungen zu verändern <abbr title="et cetera">etc.</abbr> 
Dialoge sind ein wichtiges Mittel zur Kommunikation zwischen Nutzer und Programm.
</p>

<p>
Es gibt grundsätzlich zwei Arten von Dialogen: Vordefinierte Dialoge und maßgeschneiderte Dialoge.
</p>


<h2>Vordefinierte Dialoge</h2>

<h3>QInputDialog</h3>

<p>
Der <em>QInputDialog</em> bietet einen einfachen Fertigdialog, um einen einfachen Wert von einem Nutzer zu erhalten.
Der Eingabewert kann ein String, eine Zahl oder ein Item von einer Liste sein.
</p>


<pre class="code">
#!/usr/bin/python

# inputdialog.py

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore


class InputDialog(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setGeometry(300, 300, 350, 80)
        self.setWindowTitle('InputDialog')

        self.button = QtGui.QPushButton('Dialog', self)
        self.button.setFocusPolicy(QtCore.Qt.NoFocus)

        self.button.move(20, 20)
        self.connect(self.button, QtCore.SIGNAL('clicked()'), self.showDialog)
        self.setFocus()

        self.label = QtGui.QLineEdit(self)
        self.label.move(130, 22)


    def showDialog(self):
        text, ok = QtGui.QInputDialog.getText(self, 'Input Dialog', 'Enter your name:')

        if ok:
            self.label.setText(unicode(text))


app = QtGui.QApplication(sys.argv)
icon = InputDialog()
icon.show()
app.exec_()
</pre>

<p>
Das Beispiel enthält einen Knopf und ein Eingabezeilen-Widget. Der Knopf zeigt einen
Eingabedialog für Textwerte. Der eingegebene Text wird im Eingabezeilen-Widget angezeigt.
</p>


<pre class="explanation">
<code>
 text, ok = QtGui.QInputDialog.getText(self, 'Input Dialog', 'Enter your name:')
</code>
</pre>

<p>
Diese Zeile sorgt für die Anzeige des Eingabedialogs. Der erste String ist der Titel
des Dialogs, der zweite eine Mitteilung innerhalb des Dialogs. Der Dialog gibt den
eingegeben Text und einen boolschen Wert wieder. Wenn wir auf dne OK-Knopf drücken,
ist dieser Wert <em>true</em>, andernfalls <em>false</em>.
</p>

<img src="../images/inputdialog.jpg" alt="Eingabedialog" />
<p class="figure">Abbildung: Eingabedialog</p>


<h3>QColorDialog</h3>

<p>
Der <em>QColorDialog</em> bietet ein Dialog-Widget zur Farbauswahl.
</p>


<pre class="code">
#!/usr/bin/python

# colordialog.py

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore


class ColorDialog(QtGui.QWidget):
    def __init__(self, parent=None):

        QtGui.QWidget.__init__(self, parent)

        color = QtGui.QColor(0, 0, 0) 

        self.setGeometry(300, 300, 250, 180)
        self.setWindowTitle('ColorDialog')

        self.button = QtGui.QPushButton('Dialog', self)
        self.button.setFocusPolicy(QtCore.Qt.NoFocus)
        self.button.move(20, 20)

        self.connect(self.button, QtCore.SIGNAL('clicked()'), self.showDialog)
        self.setFocus()

        self.widget = QtGui.QWidget(self)
        self.widget.setStyleSheet("QWidget { background-color: %s }" 
            % color.name())
        self.widget.setGeometry(130, 22, 100, 100)


    def showDialog(self):
        col = QtGui.QColorDialog.getColor()

        if col.isValid():
            self.widget.setStyleSheet("QWidget { background-color: %s }"
                % col.name())

app = QtGui.QApplication(sys.argv)
cd = ColorDialog()
cd.show()
app.exec_()
</pre>

<p>
Das Anwendungsbeispiel zeigt einen Druckknopf und ein <em>QWidget</em>. 
Der Widget-Hintergrund ist schwarz eingefärbt, durch die Verwendung des 
<em>QColorDialog</em> können wir die Hintergrundfarbe ändern.
</p>

<pre class="explanation">
 color = QtGui.QColorDialog.getColor()
</pre>

<p>
Diese Zeile lässt den <em>QColorDialog</em> aufklappen.
</p>

<pre class="explanation">
if col.isValid():
    self.widget.setStyleSheet("QWidget { background-color: %s }"
        % col.name())
</pre>

<p>
Wir prüfen hier die Validität der Farbe. Klicken wir den Cancel-Knopf, wird kein korrekte 
Farbe zurückgegeben, andernfalls ändern wir die Hintergrundfarbe durch Verwendung von Stylesheets.
</p>

<img src="../images/colordialog.jpg" alt="Farbauswahldialog">
<p class="figure">Abbildung: Farbauswahldialog</p>

<h3>QFontDialog</h3>

<p>
Der <em>QFontDialog</em> ist ein Dialog-Widget zur Schriftauswahl.
</p>

<pre class="code">
#!/usr/bin/python

# fontdialog.py

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore


class FontDialog(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        hbox = QtGui.QHBoxLayout()

        self.setGeometry(300, 300, 250, 110)
        self.setWindowTitle('FontDialog')

        button = QtGui.QPushButton('Dialog', self)
        button.setFocusPolicy(QtCore.Qt.NoFocus)
        button.move(20, 20)

        hbox.addWidget(button)

        self.connect(button, QtCore.SIGNAL('clicked()'), self.showDialog)

        self.label = QtGui.QLabel('Knowledge only matters', self)
        self.label.move(130, 20)

        hbox.addWidget(self.label, 1)
        self.setLayout(hbox)


    def showDialog(self):
        font, ok = QtGui.QFontDialog.getFont()
        if ok:
            self.label.setFont(font)


app = QtGui.QApplication(sys.argv)
cd = FontDialog()
cd.show()
app.exec_()
</pre>

<p>
In unserem Beispiel haben wir einen Knopf und ein Label. Mit dem <em>QFontDialog</em> können wir die Schriftart des Labels ändern.
</p>

<pre class="explanation">
 hbox.addWidget(self.label, 1)
</pre>

<p>
Wir machen das Label größenverstellbar. Das ist notwendig, weil der Text größer werden könnte,
wenn wir eine andere Schriftart auswählen. Andernfalls könnte das Label nicht vollständig sichtbar bleiben.
</p>

<pre class="explanation">
 font, ok = QtGui.QFontDialog.getFont()
</pre>

<p>
Hier lassen wir den Schrifttypdialog aufklappen.
</p>

<pre class="explanation">
 if ok:
     self.label.setFont(font)
</pre>

<p>
Wenn wir auf OK klicken, ändert sich die Schrift des Labels.
</p>

<img src="../images/fontdialog.jpg" alt="Schriftauswahldialog">
<p class="figure">Abbildung: Schriftauswahldialog</p>


<h3>QFileDialog</h3>

<p>
Der <em>QFileDialog</em> ist ein Dialog, der dem Nutzer die Auswahl von Dateien oder
 Verzeichnissen erlaubt. Die Dateien können dabei sowohl für das Öffnen als auch das Speichern ausgewählt werden.
</p>


<pre class="code">
#!/usr/bin/python

# openfiledialog.py

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore


class OpenFile(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)

        self.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('OpenFile')

        self.textEdit = QtGui.QTextEdit()
        self.setCentralWidget(self.textEdit)
        self.statusBar()
        self.setFocus()

        exit = QtGui.QAction(QtGui.QIcon('open.png'), 'Open', self)
        exit.setShortcut('Ctrl+O')
        exit.setStatusTip('Open new File')
        self.connect(exit, QtCore.SIGNAL('triggered()'), self.showDialog)

        menubar = self.menuBar()
        file = menubar.addMenu('&File')
        file.addAction(exit)

    def showDialog(self):
        filename = QtGui.QFileDialog.getOpenFileName(self, 'Open file',
                    '/home')
        file=open(filename)
        data = file.read()
        self.textEdit.setText(data)

app = QtGui.QApplication(sys.argv)
cd = OpenFile()
cd.show()
app.exec_()
</pre>

<p>
Das Beispiel zeigt eine Menüleiste, ein zentriertes Textbearbeitungs-Widget und eine Statusleiste.
Die Statusleiste dient lediglich zu Designzwecken. Das Menüitem ruft den <em>QFileDialog</em> 
auf, der zur Auswahl einer Datei verwendet wird. Die Inhalte der Datei werden in das Textbearbeitungs-Widget geladen.
</p>

<pre class="explanation">
class OpenFile(QtGui.QMainWindow):
...
        self.textEdit = QtGui.QTextEdit()
        self.setCentralWidget(self.textEdit)
</pre>

<p>
Das Beispiel basiert auf dem <em>QMainWindow</em>-Widget, da wir das Textbearbeitung-Widget 
zentral setzen. Dies lässt sich mit dem <em>QMainWindow</em>-Widget leicht umsetzen, ohne 
auf Layouts zurück greifen zu müssen.
</p>

<pre class="explanation">
 filename = QtGui.QFileDialog.getOpenFileName(self, 'Open file',
                    '/home')
</pre>

<p>
Wir lassen den <em>QFileDialog</em> aufpoppen. Der erste String in der <em>getOpenFileName</em>-Methode 
ist die Überschrift. Der zweite bestimmt das Arbeitsverzeichnis des Dialogs. Standardmäßig steht der 
Filter auf <em>All files (*)</em>.
</p>


<pre class="explanation">
 file=open(filename)
 data = file.read()
 self.textEdit.setText(data)
</pre>

<p>
Der ausgewählte Dateiname wird gelesen und die Datei mit dem Inhalt des Textbearbeitungs-Widgets gefüllt.
</p>

<img src="../images/filedialog.jpg" alt="Dateiauswahldialog">
<p class="figure">Abbildung: Dateiauswahldialog</p>


<div class="footer">
<div class="signature">
<a href="/">ZetCode</a> last modified September 11, 2007  <span class="copyright">&copy; 2007 - 2011 Jan Bodnar</span>
<span class="copyright">Translation © 2009 Manuel Stein</span>
</div>
</div>

</body> <!-- content -->
</html>
